package com.study.concurrent.C_ThreadSynchronizationHelperClass.e_SynchronizationOnCommonPoint;

import java.util.concurrent.CyclicBarrier;

/**
 * Created by 赵超 on 2017/3/25.
 */
public class Main {
    public static void main(String[] args) {
        final int ROWS = 10000;     // 行数
        final int NUMBERS = 1000;   // 列数
        final int SEARCH = 5;       // 待查找数字
        final int PARTICIPANTS = 5; // 进行查找的线程数
        final int LINES_PARTICIPANT = 2000; // 分组间隔，每组需要查找元素数
        MatrixMock matrixMock = new MatrixMock(ROWS, NUMBERS, SEARCH); // 设置矩阵属性和待查找数字
        Results results = new Results(ROWS); // 设置Results中数组data的行数
        Grouper grouper = new Grouper(results); // 传入结果
        /**
         * 设置在某个点（集合点）上需要同步的线程数量和达到指定点之后需要执行的线程
         */
        CyclicBarrier cyclicBarrier = new CyclicBarrier(PARTICIPANTS, grouper);
        /**
         * 创建5个查找类Searcher对象并用其创建线程并启动，传入同一个Result对象，这样，
         * 每个对象都会把数据即如果传入同一个Result中，Grouper对象就能获取到正确的结果
         */
        Searcher[] searchers = new Searcher[PARTICIPANTS]; // 其实不必一定要使用数组创建多个线程，按需选择即可
        for (int i = 0; i < PARTICIPANTS; i++) {
            searchers[i] = new Searcher(i * LINES_PARTICIPANT, i * LINES_PARTICIPANT + LINES_PARTICIPANT,
                    matrixMock, results, SEARCH, cyclicBarrier);
            Thread thread = new Thread(searchers[i]);
            thread.start();
        }
        System.out.printf("主线程Main结束\n");
    }
}
